package cn.justforchris.blog.service.impl;

import cn.justforchris.blog.domain.Article;
import cn.justforchris.blog.domain.Comment;
import cn.justforchris.blog.mapper.ArticleMapper;
import cn.justforchris.blog.query.CommentQuery;
import cn.justforchris.blog.query.QueryPage;
import cn.justforchris.blog.repository.CommentRepository;
import cn.justforchris.blog.service.ICommentService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 评论的业务逻辑,存储在MongoDB中,所以需要使用MongoTemplate或者创建一个repository实现MongoRepository,然后使用这个接口
 * 创建对象使用api
 */
@Service
@Transactional
public class CommentServiceImpl implements ICommentService {

    /*使用repository,使用一个接口继承MongoRepository,然后使用此接口来掉哦用api*/
    @Autowired
    private CommentRepository repository;
    /*直接使用MongoTemplate*/
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private ArticleMapper articleMapper;
    /**
     * 根据文章id查询评论
     * @param id
     * @return
     */
    @Override
    public List<Comment> findByArticleId(Long id) {
        return repository.findByArticleId(id);
    }

    /**
     * 添加评论
     * @param comment
     */
    @Override
    public void add(Comment comment) {
        Article articleById = articleMapper.getArticleById(comment.getArticleId());
        articleById.setArticleCommentNum(articleById.getArticleCommentNum()+1);
        articleMapper.updateArticle(articleById);
        repository.save(comment);
    }

    @Override
    public void update(Comment comment) {
        /*id不为空则更新，为空则添加*/
        repository.save(comment);
    }

    /**
     * 删除评论
     * @param id
     */
    @Override
    public void delete(String id) {
//        Query query = new Query(Criteria.where("id").is(id));
//        mongoTemplate.remove(query);
        Optional<Comment> byId = repository.findById(id);
        Article articleById = repository.findArticleById(id);
        articleById.setArticleCommentNum(articleById.getArticleCommentNum()-1);
        articleMapper.updateArticle(articleById);
        repository.deleteById(id);
        /*使用id删除,注意这个id不是文章id而是MongoDB的id也就是_id*/

    }

    @Override
    public PageInfo<Comment> queryPage(CommentQuery queryPage) {
        PageHelper.startPage(1,5);
        List<Comment> data = repository.findByArticleId(queryPage.getArticleId());

        /*
        queryPage.getCurrentPage()
        queryPage.getPageSize()
        这里获取到的是符合传入参数currentpage和pagesize的数据,也就是说,如果不传pagesize就只有五条因为怕个size如果不传入的话就是5
        但是如果有pagesize传入就根据传入数据来
        */
        return new PageInfo<>(data);
        /*这里面就包含了pagehelper帮忙计算出来的total(总共多少条,和根据分页提取出的数据)*/
    }


}
